#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#define left "["
#define right "]"
#include<assert.h>
#include<unistd.h>
#include<string.h>
#define argc_max 32
#define sign "$"
#define max 1024
#define dilem " "
 int last_code =0;
int quit=0;
char pwd[max];
  extern char** environ;
const char* usename()
{
  getenv("USER");
}

 void getpwd()
{
  getcwd(pwd,sizeof(pwd));
}

const char* homename()
{
  getenv("HOSTNAME");
}

void insert(char* _commdline,int size)
{
  getpwd();
  printf(left"%s@%s%s"right""sign"",usename(),homename(),pwd);
  char*s= fgets(_commdline,size,stdin);
  assert(s);
  _commdline[strlen(_commdline)-1]='\0';
 // printf("echo: %s\n",_commdline);
}

int  splitstring(char _commdline[],char* _argv[])
  {

    int i=0;
    _argv[i++] = strtok(_commdline,dilem);
    while(_argv[i++] = strtok(NULL,dilem)); 
    return i-1;
  }

void Normalexcute(char*_argv[])
{

  pid_t id=fork();
  if(id<0)
  {
    perror("fork");
    return;
  }
  else if(id==0)
  {
    //子进程
    //execvpe(_argv[0],_argv,environ);
    execvp(_argv[0],_argv);
    exit(99);
  }
  else{
//父进程
    int statues=0;
    pid_t rid=waitpid(id,&statues,0);
    if(rid==id )
    {
      last_code=WEXITSTATUS(statues);
    }
}
}

int buildexcute(char*_argv[],int argc)
{

  if(argc==2 && strcmp(_argv[0],"cd")==0)
  {
      chdir(_argv[1]);
      getpwd();
      sprintf(getenv("PWD"),"%s",pwd);
      return 1;
  }
  else if (argc==2 && strcmp(_argv[0],"export")==0)
  {
    putenv((char*)_argv[1]);
    return 1;
  }
  else if(argc==2 && strcmp(_argv[0],"echo")==0)
  {
    if(*_argv[1]=='$')
    {
      char*val=getenv(_argv[1]+1);
      if(val)printf("%s\n",val);
    }
    else
    {
      printf("%s\n",_argv[1]);
    }
    return 1;
  }


  //特殊处理
  if(strcmp(_argv[0],"ls")==0)
  {
    _argv[argc++]="--color";
    _argv[argc]=NULL;
  }
  return 0;
}

int main ()
{
char commdline[max];
char* argv[argc_max];
  while(!quit)
  {
  //先进行交互
  insert(commdline,sizeof(commdline));

// printf("echo:%s\n",commdline);
 // 
 // 分割字符串放入数组中
int m = splitstring(commdline,argv);
 if(m==0) continue;
  //内建命令
  int n= buildexcute(argv,m);

 //普通指令的执行
 
 if(!n) Normalexcute(argv);
  }

// for(int j=0;argv[j];j++)
// {
//   printf("[%d]-> %s\n",j,argv[j] );
//   
//}
  return 0;
}


















 // pid_t  id = fork();
 // if(id==0)
 // {
 //   //子进程
 //  _write(commdline,sizeof(commdline));
 //// printf("echo:%s\n",commdline); 
 // }
 // else if (id<0)
 // {
 //     perror("fork");
 //     exit(1);
 // 
 // }
 // else{
 //  int status=0;
 //  //var pid_t pid=waitpid(id,0,NULL);
 //
 // }
 //}
 // return 0;
////  
